#include<iostream>
using namespace std;
int main() {
	int n, x=0, y=0, dir=0, a[20][20]={0};
	int dx[4]={1,0,-1,0}, dy[4]={0,1,0,-1};
	bool v[20][20]={false};
	cin >> n;
	
	for(int i=1; i<=n*n; i++) {
		a[x][y] = i;
		v[x][y] = true;
		int xx = x + dx[dir];
		int yy = y + dy[dir];
		if (v[xx][yy] || xx<0 || yy<0 || xx>=n || yy>=n) {
			++dir %= 4;
		}
		/* 
			这一步相当关键，为什么 x 是等于 x + dx[dir] 而不是直接等于xx
			因为dir在上一步可能发生了变化，应该是将最新的结果赋值到矩阵中
		*/
		x = x + dx[dir];
		y = y + dy[dir];
	}
	
	for(int i=0; i<n; i++) {
		for(int j=0; j<n; j++)
			printf("%4d", a[i][j]);
		cout << endl;
	} 
	return 0;
} 
